package controllers

import (
	"github.com/goravel/framework/contracts/http"
	"goravel/app/models"
	"goravel/app/services"
	"goravel/app/types"
)

type CategoryController struct {
}

func NewCategoryController() *CategoryController {
	return &CategoryController{}
}

// Index 角色列表
// @Summary      角色列表
// @Tags         Category
// @Router       /category [get]
func (c *CategoryController) Index(ctx http.Context) http.Response {
	biz := ctx.Request().Route("biz")
	if len(biz) == 0 {
		return services.NewApiService(ctx).Error500("biz错误")
	}
	parentId := ctx.Request().QueryInt("parent_id")
	var err error
	var categories []types.CategoryResp
	categoryService := services.NewCategoryService(biz)
	categories, err = categoryService.GetChildren(parentId, 1)
	if err != nil {
		return services.NewApiService(ctx).Error500(err.Error())
	}
	return services.NewApiService(ctx).Data(categories)
}

// Show 角色详情
// @Summary      角色详情
// @Tags         Category
// @Router       /category/{id} [get]
func (c *CategoryController) Show(ctx http.Context) http.Response {
	id := ctx.Request().RouteInt64("id")
	biz := ctx.Request().Route("biz")
	if len(biz) == 0 {
		return services.NewApiService(ctx).Error500("biz错误")
	}
	var category models.Category
	var categoryResp types.CategoryResp
	var err error
	categoryService := services.NewCategoryService(biz)
	data, err := categoryService.GetById(&category, &categoryResp, id)
	if err != nil {
		return services.NewApiService(ctx).Error500(err.Error())
	}
	return services.NewApiService(ctx).Data(data)
}

// Store 新增角色
// @Summary      新增角色
// @Tags         Category
// @Router       /category [post]
func (c *CategoryController) Store(ctx http.Context) http.Response {
	biz := ctx.Request().Route("biz")
	if len(biz) == 0 {
		return services.NewApiService(ctx).Error500("biz错误")
	}
	var categoryReq types.CategoryCreateReq
	var category models.Category
	var err error
	err = ctx.Request().Bind(&categoryReq)
	if err != nil {
		return services.NewApiService(ctx).Error500("参数错误")
	}
	categoryService := services.NewCategoryService(biz)
	categoryReq.Biz = biz
	err = categoryService.Create(&category, &categoryReq)
	if err != nil {
		return services.NewApiService(ctx).Error500("保存数据错误")
	}
	return services.NewApiService(ctx).OK("ok")
}

// Update 更新角色
// @Summary      更新角色
// @Tags         Category
// @Router       /category/{id} [put]
func (c *CategoryController) Update(ctx http.Context) http.Response {
	id := ctx.Request().RouteInt64("id")
	biz := ctx.Request().Route("biz")
	if len(biz) == 0 {
		return services.NewApiService(ctx).Error500("biz错误")
	}
	var updateResp types.CategoryUpdateReq
	var category models.Category
	var err error
	err = ctx.Request().Bind(&updateResp)
	if err != nil {
		return services.NewApiService(ctx).Error500("参数错误")
	}
	categoryService := services.NewCategoryService(biz)
	err = categoryService.Update(&category, &updateResp, id)
	if err != nil {
		return services.NewApiService(ctx).Error500("更新错误")
	}
	return services.NewApiService(ctx).OK("ok")
}

// Destroy 删除角色
// @Summary      删除角色
// @Tags         Category
// @Router       /category/{id} [delete]
func (c *CategoryController) Destroy(ctx http.Context) http.Response {
	id := ctx.Request().RouteInt64("id")
	biz := ctx.Request().Route("biz")
	if len(biz) == 0 {
		return services.NewApiService(ctx).Error500("biz错误")
	}
	var category models.Category
	var err error
	categoryService := services.NewCategoryService(biz)
	err = categoryService.Delete(&category, id)
	if err != nil {
		return services.NewApiService(ctx).Error500("删除错误")
	}
	return services.NewApiService(ctx).OK("deleted")
}
